package maquina.modelol.elector;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 
 * @author Mauro y Tuki
 *
 * Lleva el estado completo de la votacion actual
 *
 */

public class LogicaVotacion {
	
	private List<Categoria> categorias;
	
	private Map<Categoria,Voto> seleccion = new HashMap<Categoria,Voto>();
	
	public LogicaVotacion(List<Categoria> categorias){
	
		if(categorias.size() >= 1){
			
			this.categorias = categorias;
		}
		else{
			throw new IllegalArgumentException("Debe haber al menos 1 categoria");
		}
	}
	
	public boolean seleccionCompleta(){
		
		boolean completo = true;
		
		int i = 0;
		
		while (i < categorias.size() && completo){
			
			Categoria categoria = categorias.get(i);
			
			completo = seleccion.containsKey(categoria);
			
			i++;
		}
		
		return completo;
	}
	
	public Map<Categoria,Voto> getVotacion(){
		
		if(seleccionCompleta()){
			
			Map<Categoria,Voto> copia = new HashMap<Categoria,Voto>();
			
			for(Categoria categoria: seleccion.keySet()){
				
				Voto voto = seleccion.get(categoria);
				
				copia.put(categoria, voto.clonar());
			}
			
			seleccion.clear();
			
			return copia;
		}
		else{
			
			throw new IllegalStateException("La seleccion aun no esta completa");
		}
	}
	
	public boolean seleccionar(Categoria categoria, Candidato candidato){
		
		if(!seleccionCompleta()){
			
			if(categorias.contains(categoria) && !categoria.getModalidad().isCompleta()){
			
				if(categoria.getCandidatos().contains(candidato)){
				
					Modalidad modalidad = categoria.getModalidad();
			
					boolean aceptada = modalidad.seleccionar(candidato);
			
					if (modalidad.isCompleta()){
				
						seleccion.put(categoria, modalidad.getVoto());
					}
					return aceptada;
				}
				else{
					
					throw new IllegalArgumentException(String.format("El candidato %s no pertenece a la categoria %s", candidato,categoria));
				}
			}
			else{
				
				throw new IllegalArgumentException("La categoria no es valida");
			}
		}
		else{
			
			throw new IllegalStateException("La seleccion esta completa");
		}
	}
	
	public boolean isCategoriaCompleta(Categoria categoria){
		
		return seleccion.containsKey(categoria);
	}
	
	public List<Categoria> getCategorias(){
		
		return categorias;
	}
	
}
